home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cocktail
/
cg.lha
/
cg
/
src
/
EvalMod3.mi
< prev
next >
Wrap
Text File
|
1992-11-24
|
34KB
|
1,147 lines
IMPLEMENTATION MODULE EvalMod3;
IMPORT SYSTEM, System, IO, Tree;
(* line 7 "" *)
FROM SYSTEM IMPORT ADR, TSIZE;
FROM General IMPORT Max;
FROM DynArray IMPORT MakeArray;
FROM IO IMPORT WriteS, WriteNl, WriteI, WriteB, StdOutput;
FROM Texts IMPORT WriteText;
FROM Sets IMPORT tSet, MakeSet, ReleaseSet, Include, Exclude, Minimum,
Maximum, IsElement, WriteSet, IsEmpty, Extract;
FROM Relations IMPORT IsRelated;
FROM TreeMod1 IMPORT BSS;
FROM TreeMod2 IMPORT GetIterator, Iterator, WriteLine;
FROM EvalMod IMPORT Class;
FROM Errors IMPORT Error, Short, MessageI;
FROM Positions IMPORT NoPosition;
IMPORT EvalMod;
FROM Tree IMPORT
NoTree , tTree , Referenced , NoCodeClass ,
Computed , Reverse , Write , Read ,
Inherited , Synthesized , Input , Output ,
Virtual , Test , Left , Right ,
HasOutput , NonBaseComp , Dummy , Trace ,
Demand , Funct , NoClass , Options ,
TreeRoot , iModule , iMain , itTree ,
ForallClasses, ForallAttributes, f , WI , WN ,
ClassCount , IdentifyClass , IdentifyAttribute,
tBitIndex , tBitInfo , iNoTree , QueryTree ;
VAR
i, i2, j, k, n, MaxBit, MaxInstCount, Check: SHORTCARD;
Node, Attr, ChildsClass : tTree;
Success, IsStable : BOOLEAN;
BitIndexSize : LONGINT;
gBitIndex : tBitIndex;
InhIndices : tSet;
InhIndexSize : LONGINT;
InhIndexCount : POINTER TO ARRAY [1..1000000] OF SHORTCARD;
PROCEDURE GenCall (t: tTree; j: SHORTCARD);
BEGIN
WITH t^.Class.Instance^ [j] DO
IF ({Synthesized, Left} <= Properties) THEN
k := ToBit0 (t, j);
WriteS (f, "IFNOTIN ("); WN (k MOD BSS); WriteS (f, ", yyt^.yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ") ");
WriteS (f, "yyS"); WN (k); WriteS (f, " (yyt); (* "); WI (Attribute^.Child.Name); WriteS (f, " *) END;"); WriteNl (f);
ELSIF ({Inherited, Left} <= Properties) THEN
k := ToBit0 (t, j);
WriteS (f, "IFNOTIN ("); WN (k MOD BSS); WriteS (f, ", yyt^.yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ") ");
IF IsElement (ORD ('Z'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, "yyVisitParent (yyt); ");
WriteS (f, "yyI [yyt^.yyHead.yyOffset + "); WN (k); WriteS (f, "](yyt^.yyHead.yyParent); (* ");
WI (Attribute^.Child.Name); WriteS (f, " *) ");
WriteS (f, 'yyWriteVisit (yyt^.yyHead.yyParent, "?"); END;'); WriteNl (f);
ELSE
WriteS (f, "yyI [yyt^.yyHead.yyOffset + "); WN (k); WriteS (f, "](yyt^.yyHead.yyParent); (* ");
WI (Attribute^.Child.Name); WriteS (f, " *) END;"); WriteNl (f);
END;
ELSIF ({Inherited, Right} <= Properties) THEN
k := ToBit1 (Selector, j - t^.Class.AttrCount - Selector^.Child.InstOffset);
WriteS (f, "IFNOTIN ("); WN (k MOD BSS); WriteS (f, ", yyt^."); WI (Class^.Class.Name);
WriteS (f, "."); WI (Selector^.Child.Name); WriteS (f, "^.yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ") ");
k := ToBit2 (t, Selector, j);
WriteS (f, "yyI"); WN (k); WriteS (f, " (yyt); (* "); WI (Selector^.Child.Name);
WriteS (f, ":"); WI (Attribute^.Child.Name); WriteS (f, " *) END;"); WriteNl (f);
ELSIF ({Synthesized, Right} <= Properties) THEN
k := ToBit1 (Selector, j - t^.Class.AttrCount - Selector^.Child.InstOffset);
WriteS (f, "IFNOTIN ("); WN (k MOD BSS); WriteS (f, ", yyt^."); WI (Class^.Class.Name);
WriteS (f, "."); WI (Selector^.Child.Name); WriteS (f, "^.yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ") ");
IF IsElement (ORD ('Z'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, 'yyWriteVisit (yyt, "'); WI (Selector^.Child.Name); WriteS (f, '"); ');
WriteS (f, "yyS"); WN (k);
WriteS (f, " (yyt^."); WI (Class^.Class.Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "); (* "); WI (Selector^.Child.Name); WriteS (f, ":"); WI (Attribute^.Child.Name); WriteS (f, " *) ");
WriteS (f, "yyVisitParent (yyt^."); WI (Class^.Class.Name); WriteS (f, "."); WI (Selector^.Child.Name); WriteS (f, "); END;"); WriteNl (f);
ELSE
WriteS (f, "yyS"); WN (k);
WriteS (f, " (yyt^."); WI (Class^.Class.Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "); (* "); WI (Selector^.Child.Name); WriteS (f, ":"); WI (Attribute^.Child.Name); WriteS (f, " *) END;"); WriteNl (f);
END;
END;
END;
END GenCall;
PROCEDURE GenEvalAttr (t: tTree; i: INTEGER);
BEGIN
Class := t;
WITH t^.Class.Instance^ [i] DO
IF IsElement (ORD ('X'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, 'yyWriteEval (yyt, "'); WI (Attribute^.Child.Name); WriteS (f, '");'); WriteNl (f);
IF (Action # ADR (Action)) AND NOT (Virtual IN Properties) THEN
GenEvaluator (Action);
EvalMod.GenEvaluator (Action); WriteNl (f);
IF Test IN Properties THEN
WriteS (f, "writeBOOLEAN (yyb) yyWriteNl;"); WriteNl (f);
ELSIF (Attribute^.Kind = Tree.Child) OR (Attribute^.Attribute.Type = itTree) THEN
WriteS (f, "write"); WI (itTree);
WriteS (f, " (yyt^."); WI (t^.Class.Name); WriteS (f, "."); WI (Attribute^.Child.Name); WriteS (f, ")"); WriteNl (f);
ELSE
WriteS (f, "write"); WI (Attribute^.Child.Type);
WriteS (f, " (yyt^."); WI (t^.Class.Name); WriteS (f, "."); WI (Attribute^.Child.Name); WriteS (f, ") yyWriteNl;"); WriteNl (f);
END;
ELSE
WriteS (f, "yyWriteNl;"); WriteNl (f);
END;
ELSIF IsElement (ORD ('Y'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, 'yyWriteEval (yyt, "'); WI (Attribute^.Child.Name); WriteS (f, '");'); WriteNl (f);
IF (Action # ADR (Action)) AND NOT (Virtual IN Properties) THEN
GenEvaluator (Action);
EvalMod.GenEvaluator (Action);
END;
ELSE
IF (Action # ADR (Action)) AND NOT (Virtual IN Properties) THEN
GenEvaluator (Action);
EvalMod.GenEvaluator (Action);
END;
END;
END;
END GenEvalAttr;
PROCEDURE yyAbort (yyFunction: ARRAY OF CHAR);
BEGIN
IO.WriteS (IO.StdError, 'Error: module EvalMod3, routine ');
IO.WriteS (IO.StdError, yyFunction);
IO.WriteS (IO.StdError, ' failed');
IO.WriteNl (IO.StdError);
Exit;
END yyAbort;
PROCEDURE yyIsEqual (yya, yyb: ARRAY OF SYSTEM.BYTE): BOOLEAN;
VAR yyi : INTEGER;
BEGIN
FOR yyi := 0 TO INTEGER (HIGH (yya)) DO
IF yya [yyi] # yyb [yyi] THEN RETURN FALSE; END;
END;
RETURN TRUE;
END yyIsEqual;
PROCEDURE EvalImplMod (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
| 2: yyR2: RECORD
a: SHORTCARD;
END;
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Ag) THEN
(* line 130 "" *)
WITH t^.Ag DO
(* line 130 "" *)
MaxBit := 0;
MaxInstCount := 0;
ForallClasses (Classes, CompBitInfo);
MakeSet (InhIndices, MaxInstCount);
InhIndexSize := MaxInstCount;
MakeArray (InhIndexCount, InhIndexSize, TSIZE (SHORTCARD));
FOR i := 1 TO MaxInstCount DO InhIndexCount^ [i] := 0; END;
ForallClasses (Classes, CompInhIndices);
WriteS (f, "# define IFNOTIN(b, s) IF NOT (b IN s) THEN"); WriteNl (f);
WriteS (f, "# define REMOTE_SYN(i, b, c, n, t, a) n^.t.a"); WriteNl (f);
WriteS (f, "# define REMOTE_INH(i, b, k, n, t, a) n^.t.a"); WriteNl (f);
EvalMod.EvalImplHead (t);
WriteNl (f);
WriteS (f, "VAR yyI: ARRAY [0.."); WN (Maximum (InhIndices)); WriteS (f, "] OF "); WI (iMain); WriteS (f, ".tProcTree;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE yyAbort (yyt: "); WI (iMain); WriteS (f, "."); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " IO.WriteS (IO.StdError, 'Error: module "); WI (EvalName); WriteS (f, ", cyclic dependencies');"); WriteNl (f);
WriteS (f, " IO.WriteNl (IO.StdError);"); WriteNl (f);
WriteS (f, " IO.CloseIO;"); WriteNl (f);
WriteS (f, " "); WI (iMain); WriteS (f, ".yyExit;"); WriteNl (f);
WriteS (f, " END yyAbort;"); WriteNl (f);
WriteNl (f);
IF NOT IsElement (ORD ('9'), Options) THEN
WriteNl (f);
WriteS (f, "PROCEDURE Eval (yyt: "); WI (iMain); WriteS (f, "."); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " BEGIN "); WI (iMain); WriteS (f, ".Init"); WI (iModule); WriteS (f, " (yyt); yyE (yyt); END Eval;"); WriteNl (f);
ELSE
WriteNl (f);
WriteS (f, "VAR xxStack: CARDINAL;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE Eval (yyt: "); WI (iMain); WriteS (f, "."); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " VAR xxHigh: BOOLEAN;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " xxStack := MAX (INTEGER);"); WriteNl (f);
WriteS (f, " "); WI (iMain); WriteS (f, ".Init"); WI (iModule); WriteS (f, " (yyt); yyE (yyt);"); WriteNl (f);
WriteS (f, " IO.WriteS (IO.StdOutput, 'Stacksize ');"); WriteNl (f);
WriteS (f, " IO.WriteI (IO.StdOutput, CARDINAL (SYSTEM.ADR (xxHigh)) - xxStack, 0);"); WriteNl (f);
WriteS (f, " IO.WriteNl (IO.StdOutput);"); WriteNl (f);
WriteS (f, " END Eval;"); WriteNl (f);
END;
WriteNl (f);
REPEAT IsStable := TRUE; ForallClasses (Classes, CompOutput); UNTIL IsStable;
WriteS (f, "PROCEDURE yyE (yyt: "); WI (iMain); WriteS (f, "."); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteLine (TreeRoot^.Ag.EvalCodes^.Codes.LocalLine);
WriteText (f, TreeRoot^.Ag.EvalCodes^.Codes.Local);
Node := TreeRoot^.Ag.Modules;
WHILE Node^.Kind = Tree.Module DO
WriteLine (Node^.Module.EvalCodes^.Codes.LocalLine);
WriteText (f, Node^.Module.EvalCodes^.Codes.Local);
Node := Node^.Module.Next;
END;
IF IsElement (ORD ('9'), Options) THEN
WriteS (f, " VAR xxLow: BOOLEAN;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " xxStack := General.Min (xxStack, CARDINAL (SYSTEM.ADR (xxLow)));"); WriteNl (f);
ELSE
WriteS (f, " BEGIN"); WriteNl (f);
END;
WriteS (f, " LOOP"); WriteNl (f);
WriteS (f, " IF (yyt = "); WI (iMain); WriteS (f, "."); WI (iNoTree); WriteS (f, ") OR (0 IN yyt^.yyHead.yyIsComp0) THEN RETURN; END;"); WriteNl (f);
WriteS (f, " INCL (yyt^.yyHead.yyIsComp0, 0);"); WriteNl (f);
WriteS (f, " CASE yyt^.Kind OF"); WriteNl (f);
ForallClasses (Classes, GenE);
WriteS (f, " ELSE RETURN;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END yyE;"); WriteNl (f);
WriteNl (f);
FOR i := 2 TO MaxBit DO
n := 0; (* are there any SYN attributes ? *)
ForallClasses (Classes, CountSynAttr);
IF n > 0 THEN
WriteS (f, "PROCEDURE yyS"); WN (i - 1); WriteS (f, " (yyt: "); WI (iMain); WriteS (f, "."); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteLine (TreeRoot^.Ag.EvalCodes^.Codes.LocalLine);
WriteText (f, TreeRoot^.Ag.EvalCodes^.Codes.Local);
Node := TreeRoot^.Ag.Modules;
WHILE Node^.Kind = Tree.Module DO
WriteLine (Node^.Module.EvalCodes^.Codes.LocalLine);
WriteText (f, Node^.Module.EvalCodes^.Codes.Local);
Node := Node^.Module.Next;
END;
IF IsElement (ORD ('9'), Options) THEN
WriteS (f, " VAR xxLow: BOOLEAN;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " xxStack := General.Min (xxStack, CARDINAL (SYSTEM.ADR (xxLow)));"); WriteNl (f);
ELSE
WriteS (f, " BEGIN"); WriteNl (f);
END;
IF IsElement (ORD ('5'), Options) THEN
WriteS (f, " IFNOTIN ("); WN ((i - 1) MOD BSS); WriteS (f, ", yyt^.yyHead.yyIsDone"); WN ((i - 1) DIV BSS);
WriteS (f, ") INCL (yyt^.yyHead.yyIsDone"); WN ((i - 1) DIV BSS); WriteS (f, ", "); WN ((i - 1) MOD BSS); WriteS (f, "); ELSE yyAbort (yyt); END;"); WriteNl (f);
END;
IF n > 1 THEN
WriteS (f, " CASE yyt^.Kind OF"); WriteNl (f);
ForallClasses (Classes, GenS);
WriteS (f, " END;"); WriteNl (f);
ELSE
ForallClasses (Classes, GenS);
END;
WriteS (f, " INCL (yyt^.yyHead.yyIsComp"); WN ((i - 1) DIV BSS); WriteS (f, ", "); WN ((i - 1) MOD BSS); WriteS (f, ");"); WriteNl (f);
WriteS (f, " END yyS"); WN (i - 1); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
END;
END;
FOR i := Minimum (InhIndices) TO Maximum (InhIndices) DO
IF IsElement (i, InhIndices) THEN
WriteS (f, "PROCEDURE yyI"); WN (i); WriteS (f, " (yyt: "); WI (iMain); WriteS (f, "."); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteLine (TreeRoot^.Ag.EvalCodes^.Codes.LocalLine);
WriteText (f, TreeRoot^.Ag.EvalCodes^.Codes.Local);
Node := TreeRoot^.Ag.Modules;
WHILE Node^.Kind = Tree.Module DO
WriteLine (Node^.Module.EvalCodes^.Codes.LocalLine);
WriteText (f, Node^.Module.EvalCodes^.Codes.Local);
Node := Node^.Module.Next;
END;
IF IsElement (ORD ('9'), Options) THEN
WriteS (f, " VAR xxLow: BOOLEAN;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " xxStack := General.Min (xxStack, CARDINAL (SYSTEM.ADR (xxLow)));"); WriteNl (f);
ELSE
WriteS (f, " BEGIN"); WriteNl (f);
END;
Check := 0;
IF InhIndexCount^ [i] > 1 THEN
WriteS (f, " CASE yyt^.Kind OF"); WriteNl (f);
ForallClasses (Classes, EvalImplMod);
WriteS (f, " END;"); WriteNl (f);
ELSE
ForallClasses (Classes, EvalImplMod);
END;
IF Check # InhIndexCount^ [i] THEN
MessageI ("internal error in yyI", Error, NoPosition, Short, ADR (i));
END;
WriteS (f, " END yyI"); WN (i); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
END;
END;
WriteS (f, "PROCEDURE Begin"); WI (EvalName); WriteS (f, ";"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteLine (EvalCodes^.Codes.BeginLine);
WriteText (f, EvalCodes^.Codes.Begin);
Node := Modules;
WHILE Node^.Kind = Tree.Module DO
WriteLine (Node^.Module.EvalCodes^.Codes.BeginLine);
WriteText (f, Node^.Module.EvalCodes^.Codes.Begin);
Node := Node^.Module.Next;
END;
WriteS (f, " END Begin"); WI (EvalName); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE Close"); WI (EvalName); WriteS (f, ";"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteLine (EvalCodes^.Codes.CloseLine);
WriteText (f, EvalCodes^.Codes.Close);
Node := Modules;
WHILE Node^.Kind = Tree.Module DO
WriteLine (Node^.Module.EvalCodes^.Codes.CloseLine);
WriteText (f, Node^.Module.EvalCodes^.Codes.Close);
Node := Node^.Module.Next;
END;
WriteS (f, " END Close"); WI (EvalName); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
WriteS (f, "BEGIN"); WriteNl (f);
IF IsElement (ORD ('X'), Options) THEN
WriteS (f, " yyf := IO.StdOutput;"); WriteNl (f);
END;
FOR i := Minimum (InhIndices) TO Maximum (InhIndices) DO
IF IsElement (i, InhIndices) THEN
WriteS (f, " yyI ["); WN (i); WriteS (f, "] := yyI"); WN (i); WriteS (f, ";"); WriteNl (f);
END;
END;
WriteS (f, "END "); WI (EvalName); WriteS (f, "."); WriteNl (f);
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Class) THEN
(* line 304 "" *)
WITH yyTempo.yyR2 DO
LOOP
WITH t^.Class DO
(* line 305 "" *)
IF NOT (NoCodeClass * Properties = {}) THEN EXIT; END;
(* line 306 "" *)
IF NOT (i <= InstCount) THEN EXIT; END;
(* line 307 "" *)
;
(* line 308 "" *)
a := ToAttr (t, i);
IF a = 0 THEN RETURN; END;
WITH Instance^ [a] DO
IF {Inherited, Right} <= Properties THEN
Class := t;
IF InhIndexCount^ [i] > 1 THEN
WriteS (f, " | "); WI (iMain); WriteS (f, "."); WI (Name); WriteS (f, ":"); WriteNl (f);
END;
INC (Check);
k := ToBit1 (Selector, a - AttrCount - Selector^.Child.InstOffset);
IF IsElement (ORD ('5'), Options) THEN
WriteS (f, " IFNOTIN ("); WN (k MOD BSS); WriteS (f, ", yyt^."); WI (Class^.Class.Name);
WriteS (f, "."); WI (Selector^.Child.Name); WriteS (f, "^.yyHead.yyIsDone"); WN (k DIV BSS);
WriteS (f, ") INCL (yyt^."); WI (Class^.Class.Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "^.yyHead.yyIsDone"); WN (k DIV BSS); WriteS (f, ", "); WN (k MOD BSS); WriteS (f, "); ELSE yyAbort (yyt); END;"); WriteNl (f);
END;
FOR j := 1 TO InstCount DO
IF IsRelated (a, j, DP) THEN
GenCall (t, j);
END;
END;
IF IsElement (ORD ('X'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, 'yyWriteEval (yyt, "'); WI (Selector^.Child.Name); WriteS (f, ":"); WI (Attribute^.Child.Name); WriteS (f, '");'); WriteNl (f);
IF (Action # ADR (Action)) AND NOT (Virtual IN Properties) THEN
GenEvaluator (Action);
EvalMod.GenEvaluator (Action); WriteNl (f);
IF (Attribute^.Kind = Tree.Child) OR (Attribute^.Attribute.Type = itTree) THEN
WriteS (f, "write"); WI (itTree);
WriteS (f, " (yyt^."); WI (Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "^."); WI (Selector^.Child.Type); WriteS (f, "."); WI (Attribute^.Child.Name); WriteS (f, ")"); WriteNl (f);
ELSE
WriteS (f, "write"); WI (Attribute^.Child.Type);
WriteS (f, " (yyt^."); WI (Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "^."); WI (Selector^.Child.Type); WriteS (f, "."); WI (Attribute^.Child.Name); WriteS (f, ") yyWriteNl;"); WriteNl (f);
END;
ELSE
WriteS (f, "yyWriteNl;"); WriteNl (f);
END;
ELSIF IsElement (ORD ('Y'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, 'yyWriteEval (yyt, "'); WI (Selector^.Child.Name); WriteS (f, ":"); WI (Attribute^.Child.Name); WriteS (f, '");'); WriteNl (f);
IF (Action # ADR (Action)) AND NOT (Virtual IN Properties) THEN
GenEvaluator (Action);
EvalMod.GenEvaluator (Action);
END;
ELSE
IF (Action # ADR (Action)) AND NOT (Virtual IN Properties) THEN
GenEvaluator (Action);
EvalMod.GenEvaluator (Action);
END;
END;
IF NOT (Input IN Properties) AND (Attribute^.Kind = Tree.Child) THEN
WriteS (f, "WITH yyt^."); WI (Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "^."); WI (Selector^.Child.Type); WriteS (f, "."); WI (Attribute^.Child.Name);
WriteS (f, "^.yyHead DO IF yyParent = "); WI (iMain); WriteS (f, "."); WI (iNoTree); WriteS (f, " THEN yyOffset := ");
WN (Selector^.Child.Class^.Class.BitCount + Attribute^.Child.BitOffset);
WriteS (f, "; yyParent := yyt^."); WI (Name); WriteS (f, "."); WI (Selector^.Child.Name); WriteS (f, "; "); WriteNl (f);
WI (iMain); WriteS (f, ".Init"); WI (iModule); WriteS (f, " (yyt^."); WI (Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "^."); WI (Selector^.Child.Type); WriteS (f, "."); WI (Attribute^.Child.Name); WriteS (f, "); END; END;"); WriteNl (f);
END;
FOR i2 := 1 TO InstCount DO (* add group members *)
IF Instance^[i2].Action = Action THEN
WITH Instance^[i2] DO
IF Synthesized IN Properties THEN
k := ToBit0 (Class, i2);
WriteS (f, " INCL (yyt^.yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ", "); WN (k MOD BSS); WriteS (f, ");"); WriteNl (f);
ELSIF Inherited IN Properties THEN
k := ToBit1 (Selector, i2 - AttrCount - Selector^.Child.InstOffset);
WriteS (f, " INCL (yyt^."); WI (Class^.Class.Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "^.yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ", "); WN (k MOD BSS); WriteS (f, ");"); WriteNl (f);
END;
END;
END;
END;
END;
END;
;
RETURN;
END;
END;
END;
END;
END EvalImplMod;
PROCEDURE CompBitInfo (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 387 "" *)
WITH t^.Class DO
(* line 388 "" *)
BitIndexSize := AttrCount;
(* line 389 "" *)
MakeArray (BitIndex, BitIndexSize, TSIZE (tBitInfo));
(* line 390 "" *)
i := 1;
(* line 391 "" *)
gBitIndex := BitIndex;
(* line 392 "" *)
ForallAttributes (t, CompBitInfo);
(* line 393 "" *)
MaxBit := Max (i, MaxBit);
(* line 394 "" *)
MaxInstCount := Max (InstCount, MaxInstCount);
RETURN;
END;
END;
IF (t^.Kind = Tree.Child) THEN
(* line 396 "" *)
LOOP
WITH t^.Child DO
(* line 398 "" *)
IF NOT (({Input, Test, Dummy} * Properties = {})) THEN EXIT; END;
(* line 399 "" *)
INC (i);
(* line 400 "" *)
gBitIndex ^ [AttrIndex] . ToBit := i;
(* line 401 "" *)
gBitIndex ^ [i] . ToAttr := AttrIndex;
RETURN;
END;
END;
END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 396 "" *)
LOOP
WITH t^.Attribute DO
(* line 398 "" *)
IF NOT (({Input, Test, Dummy} * Properties = {})) THEN EXIT; END;
(* line 399 "" *)
INC (i);
(* line 400 "" *)
gBitIndex ^ [AttrIndex] . ToBit := i;
(* line 401 "" *)
gBitIndex ^ [i] . ToAttr := AttrIndex;
RETURN;
END;
END;
END;
END CompBitInfo;
PROCEDURE CompInhIndices (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
| 1: yyR1: RECORD
b: INTEGER;
END;
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 406 "" *)
WITH yyTempo.yyR1 DO
WITH t^.Class DO
(* line 407 "" *)
;
(* line 408 "" *)
FOR j := AttrCount + 1 TO InstCount DO
WITH Instance^ [j] DO
IF Inherited IN Properties THEN
b := ToBit2 (t, Selector, j);
Include (InhIndices, b);
INC (InhIndexCount^ [b]);
END;
END;
END;
;
RETURN;
END;
END;
END;
END CompInhIndices;
PROCEDURE CountSynAttr (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 421 "" *)
LOOP
WITH t^.Class DO
(* line 422 "" *)
IF NOT (NoCodeClass * Properties = {}) THEN EXIT; END;
(* line 423 "" *)
IF NOT (i <= BitCount) THEN EXIT; END;
(* line 424 "" *)
WITH Instance^ [BitIndex^ [i].ToAttr] DO
IF ({Synthesized, Left} <= Properties) AND NOT (Test IN Properties) THEN
INC (n);
END;
END;
;
RETURN;
END;
END;
END;
END CountSynAttr;
PROCEDURE WriteType (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 433 "" *)
LOOP
WITH t^.Class DO
(* line 434 "" *)
IF NOT (NoCodeClass * Properties = {}) THEN EXIT; END;
(* line 435 "" *)
IF NOT (Trace IN Properties) THEN EXIT; END;
(* line 436 "" *)
WriteS (f, "| ");
(* line 436 "" *)
WI (TreeRoot ^ . Ag . TreeName);
(* line 436 "" *)
WriteS (f, ".");
(* line 436 "" *)
WI (Name);
(* line 436 "" *)
WriteS (f, ": yyWriteS ('");
(* line 436 "" *)
WI (Name);
(* line 436 "" *)
WriteS (f, "');");
(* line 436 "" *)
WriteNl (f);
RETURN;
END;
END;
END;
END WriteType;
PROCEDURE GenS (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 441 "" *)
LOOP
WITH t^.Class DO
(* line 442 "" *)
IF NOT (NoCodeClass * Properties = {}) THEN EXIT; END;
(* line 443 "" *)
IF NOT (i <= BitCount) THEN EXIT; END;
(* line 444 "" *)
WITH Instance^ [BitIndex^ [i].ToAttr] DO
IF ({Synthesized, Left} <= Properties) AND NOT (Test IN Properties) THEN
Class := t;
IF n > 1 THEN
WriteS (f, " | "); WI (iMain); WriteS (f, "."); WI (Name); WriteS (f, ":"); WriteNl (f);
END;
FOR j := 1 TO InstCount DO
IF IsRelated (BitIndex^ [i].ToAttr, j, DP) THEN
GenCall (t, j);
END;
END;
GenEvalAttr (t, BitIndex^ [i].ToAttr);
IF NOT (Input IN Properties) AND (Attribute^.Kind = Tree.Child) THEN
WriteS (f, "WITH yyt^."); WI (Name); WriteS (f, "."); WI (Attribute^.Child.Name);
WriteS (f, "^.yyHead DO IF yyParent = "); WI (iMain); WriteS (f, "."); WI (iNoTree); WriteS (f, " THEN yyOffset := ");
WN (BitCount + Attribute^.Child.BitOffset); WriteS (f, "; yyParent := yyt; ");
WI (iMain); WriteS (f, ".Init"); WI (iModule); WriteS (f, " (yyt^."); WI (Name); WriteS (f, "."); WI (Attribute^.Child.Name); WriteS (f, "); END; END;"); WriteNl (f);
END;
FOR i2 := 1 TO InstCount DO (* add group members *)
IF Instance^[i2].Action = Action THEN
WITH Instance^[i2] DO
IF Synthesized IN Properties THEN
k := ToBit0 (Class, i2);
IF k # i - 1 THEN
WriteS (f, " INCL (yyt^.yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ", "); WN (k MOD BSS); WriteS (f, ");"); WriteNl (f);
END;
ELSIF Inherited IN Properties THEN
k := ToBit1 (Selector, i2 - AttrCount - Selector^.Child.InstOffset);
WriteS (f, " INCL (yyt^."); WI (Class^.Class.Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "^.yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ", "); WN (k MOD BSS); WriteS (f, ");"); WriteNl (f);
END;
END;
END;
END;
END;
END;
;
RETURN;
END;
END;
END;
END GenS;
PROCEDURE GenE (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
| 1: yyR1: RECORD
ToCompute: tSet;
END;
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 484 "" *)
WITH yyTempo.yyR1 DO
WITH t^.Class DO
(* line 485 "" *)
;
(* line 486 "" *)
GetIterator (t);
n := 0;
j := 2;
LOOP
IF j > InstCount THEN EXIT; END;
WITH Instance^ [j] DO
IF {Dummy, Output, Test} * Properties # {} THEN
IF (Test IN Properties) OR
({Synthesized, Left} <= Properties) OR
({Inherited, Right} <= Properties) OR
({Inherited, Left} <= Properties) AND
NOT (Input IN Properties) AND (Attribute^.Kind = Tree.Child) OR
({Synthesized, Right, Dummy} <= Properties) AND (Selector # Iterator) AND
(HasOutput IN Selector^.Child.Class^.Class.Properties) THEN
INC (n); EXIT;
END;
END;
END;
INC (j);
END;
IF (n = 0) AND ((Iterator = NoTree) OR NOT (HasOutput IN Iterator^.Child.Class^.Class.Properties)) THEN RETURN; END;
Class := t;
WriteS (f, " | "); WI (iMain); WriteS (f, "."); WI (Name); WriteS (f, ":"); WriteNl (f);
FOR j := 2 TO InstCount DO
WITH Instance^ [j] DO
IF {Dummy, Output} * Properties # {} THEN
IF ({Synthesized, Left} <= Properties) OR
({Inherited, Right} <= Properties) OR
({Inherited, Left} <= Properties) AND
NOT (Input IN Properties) AND (Attribute^.Kind = Tree.Child) THEN
GenCall (t, j);
ELSIF ({Synthesized, Right, Dummy} <= Properties) AND (Selector # Iterator) AND
(HasOutput IN Selector^.Child.Class^.Class.Properties) THEN
IF IsElement (ORD ('Z'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, "yyWriteVisit (yyt, '"); WI (Selector^.Child.Name); WriteS (f, "'); ");
END;
WriteS (f, "yyE (yyt^."); WI (Name); WriteS (f, "."); WI (Selector^.Child.Name); WriteS (f, ");"); WriteNl (f);
IF IsElement (ORD ('Z'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, "yyVisitParent (yyt^."); WI (Name); WriteS (f, "."); WI (Selector^.Child.Name); WriteS (f, ");"); WriteNl (f);
END;
END;
END;
END;
END;
MakeSet (ToCompute, InstCount);
FOR i := 2 TO AttrCount DO
WITH Instance^ [i] DO
IF Test IN Properties THEN
FOR j := 2 TO InstCount DO
IF IsRelated (i, j, DP) THEN
IF {Synthesized, Inherited} * Instance^ [j].Properties # {} THEN
Include (ToCompute, j);
END;
END;
END;
END;
END;
END;
FOR i := 2 TO InstCount DO
WITH Instance^ [i] DO
IF ({Synthesized, Left, Output} <= Properties) OR
({Inherited, Right, Output} <= Properties) THEN
Exclude (ToCompute, i);
END;
END;
END;
WHILE NOT IsEmpty (ToCompute) DO
GenCall (t, Extract (ToCompute));
END;
ReleaseSet (ToCompute);
FOR i := 2 TO AttrCount DO
IF Test IN Instance^ [i].Properties THEN
GenEvalAttr (t, i);
END;
END;
IF (Iterator = NoTree) OR NOT (HasOutput IN Iterator^.Child.Class^.Class.Properties) THEN
WriteS (f, "RETURN;"); WriteNl (f);
ELSE
IF IsElement (ORD ('Z'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, "yyWriteVisit (yyt, '"); WI (Iterator^.Child.Name); WriteS (f, "'); ");
END;
WriteS (f, "yyt := yyt^."); WI (Name); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, ";"); WriteNl (f);
END;
;
RETURN;
END;
END;
END;
END GenE;
PROCEDURE CompOutput (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 576 "" *)
LOOP
WITH t^.Class DO
(* line 577 "" *)
IF NOT (NOT (HasOutput IN Properties)) THEN EXIT; END;
(* line 578 "" *)
Success := FALSE;
(* line 579 "" *)
ForallAttributes (t, CompOutput);
(* line 580 "" *)
ForallClasses (Extensions, CompOutput2);
(* line 581 "" *)
IF NOT (Success) THEN EXIT; END;
(* line 582 "" *)
INCL (Properties, HasOutput);
(* line 583 "" *)
IsStable := FALSE;
RETURN;
END;
END;
END;
IF (t^.Kind = Tree.Child) THEN
(* line 585 "" *)
LOOP
WITH t^.Child DO
(* line 586 "" *)
IF NOT ((Output IN Properties) OR (HasOutput IN Class ^ . Class . Properties)) THEN EXIT; END;
(* line 587 "" *)
Success := TRUE;
RETURN;
END;
END;
END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 589 "" *)
LOOP
WITH t^.Attribute DO
(* line 590 "" *)
IF NOT (({Test, Output} * Properties # {})) THEN EXIT; END;
(* line 591 "" *)
Success := TRUE;
RETURN;
END;
END;
END;
END CompOutput;
PROCEDURE CompOutput2 (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 596 "" *)
LOOP
WITH t^.Class DO
(* line 597 "" *)
IF NOT (HasOutput IN Properties) THEN EXIT; END;
(* line 598 "" *)
Success := TRUE;
RETURN;
END;
END;
END;
END CompOutput2;
PROCEDURE ToBit0 (yyP2: Tree.tTree; yyP1: INTEGER): INTEGER;
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
(* line 602 "" *)
RETURN yyP2 ^ . Class . BitIndex ^ [yyP1] . ToBit - 1;
END ToBit0;
PROCEDURE ToBit1 (yyP4: Tree.tTree; yyP3: INTEGER): INTEGER;
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
(* line 605 "" *)
RETURN yyP4 ^ . Child . Class ^ . Class . BitIndex ^ [yyP3] . ToBit - 1;
END ToBit1;
PROCEDURE ToBit2 (yyP7: Tree.tTree; yyP6: Tree.tTree; yyP5: SHORTCARD): INTEGER;
VAR yyTempo: RECORD CASE : INTEGER OF
| 1: yyR1: RECORD
yyV1: INTEGER;
END;
END; END;
BEGIN
(* line 608 "" *)
WITH yyTempo.yyR1 DO
(* line 609 "" *)
WITH yyP6^.Child DO
RETURN yyP7^.Class.BitCount + BitOffset +
Class^.Class.BitIndex^ [yyP5 - yyP7^.Class.AttrCount - InstOffset].ToBit - 1;
END;
;
RETURN yyV1;
END;
END ToBit2;
PROCEDURE ToAttr (yyP9: Tree.tTree; yyP8: INTEGER): INTEGER;
(* line 616 "" *)
VAR a: SHORTCARD;
VAR yyTempo: RECORD CASE : INTEGER OF
| 1: yyR1: RECORD
yyV1: INTEGER;
END;
END; END;
BEGIN
(* line 617 "" *)
WITH yyTempo.yyR1 DO
(* line 618 "" *)
WITH yyP9^.Class DO
FOR a := AttrCount + 1 TO InstCount DO
WITH Instance^ [a] DO
IF ({Input, Test, Dummy} * Properties = {}) AND
(ToBit2 (yyP9, Selector, a) = yyP8) THEN RETURN a; END;
END;
END;
END;
RETURN 0;
;
RETURN yyV1;
END;
END ToAttr;
PROCEDURE GenEvaluator (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
| 9: yyR9: RECORD
TheClass: Tree.tTree;
k: INTEGER;
END;
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
CASE t^.Kind OF
| Tree.Assign:
(* line 631 "" *)
WITH t^.Assign DO
(* line 633 "" *)
GenEvaluator (Arguments);
RETURN;
END;
| Tree.Copy:
(* line 631 "" *)
WITH t^.Copy DO
(* line 633 "" *)
GenEvaluator (Arguments);
RETURN;
END;
| Tree.TargetCode:
(* line 635 "" *)
WITH t^.TargetCode DO
(* line 636 "" *)
GenEvaluator (Code);
RETURN;
END;
| Tree.Check:
(* line 638 "" *)
WITH t^.Check DO
(* line 639 "" *)
GenEvaluator (Condition);
(* line 640 "" *)
GenEvaluator (Statement);
(* line 641 "" *)
GenEvaluator (Actions);
RETURN;
END;
| Tree.Designator:
(* line 643 "" *)
WITH t^.Designator DO
(* line 647 "" *)
GenEvaluator (Next);
RETURN;
END;
| Tree.Ident:
(* line 643 "" *)
WITH t^.Ident DO
(* line 647 "" *)
GenEvaluator (Next);
RETURN;
END;
| Tree.Any:
(* line 643 "" *)
WITH t^.Any DO
(* line 647 "" *)
GenEvaluator (Next);
RETURN;
END;
| Tree.Anys:
(* line 643 "" *)
WITH t^.Anys DO
(* line 647 "" *)
GenEvaluator (Next);
RETURN;
END;
| Tree.Remote:
(* line 649 "" *)
WITH yyTempo.yyR9 DO
WITH t^.Remote DO
(* line 650 "" *)
;
(* line 650 "" *)
;
(* line 651 "" *)
TheClass := IdentifyClass (TreeRoot ^ . Ag . Classes, Type);
(* line 652 "" *)
IF TheClass # NoTree THEN
Attr := IdentifyAttribute (TheClass, Attribute);
IF Attr # NoTree THEN
WITH Attr^.Attribute DO
k := ToBit0 (TheClass, AttrIndex);
IF Synthesized IN Properties THEN
WriteS (f, "IFNOTIN ("); WN (k MOD BSS); WriteS (f, ","); EvalMod.GenEvaluator (Designators);
WriteS (f, "^.yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ") yyS"); WN (k); WriteS (f, " (");
EvalMod.GenEvaluator (Designators); WriteS (f, "); END;"); WriteNl (f);
ELSIF Inherited IN Properties THEN
WriteS (f, "IFNOTIN ("); WN (k MOD BSS); WriteS (f, ","); EvalMod.GenEvaluator (Designators);
WriteS (f, "^.yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ") yyI [");
EvalMod.GenEvaluator (Designators); WriteS (f, "^.yyHead.yyOffset + "); WN (k);
WriteS (f, "]("); EvalMod.GenEvaluator (Designators); WriteS (f, "^.yyHead.yyParent); END;"); WriteNl (f);
END;
END;
END;
END;
GenEvaluator (Next);
;
RETURN;
END;
END;
ELSE END;
END GenEvaluator;
PROCEDURE BeginEvalMod3;
BEGIN
END BeginEvalMod3;
PROCEDURE CloseEvalMod3;
BEGIN
END CloseEvalMod3;
PROCEDURE yyExit;
BEGIN
IO.CloseIO; System.Exit (1);
END yyExit;
BEGIN
yyf := IO.StdOutput;
Exit := yyExit;
BeginEvalMod3;
END EvalMod3.